<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    var arr = [1, 2, [4, 5, 6, [8, 5,]], 9]
    // 数组的扁平化就是将一个嵌套多层的数组转换为只有一层的数组
    //第一种方法
    /*
          通过循环递归的方式，先在函数里面定义一个空数组，循环传来的形参数组，
           判断每一项是否是数组，如果是就继续往下遍历，不是就添加到空数组里面
    */
    // function fn(arr) {
    //     let relust = []
    //     arr.forEach(element => {
    //         if (Array.isArray(element)) {
    //             relust = relust.concat(fn(element))
    //         } else {
    //             relust.push(element)
    //         }
    //     });
    //     return relust
    // }
    // console.log(fn(arr));


    //第二种方法
    /*
         toString和split结合
         先通过toString()把数组转成String对象，再结合split() 方法使用逗号分隔符将String对象分割成字符串数组，
         再用map函数将数组中的字符串转成数字。
    */
    // function fn1(arr) {
    //     return arr.toString().split(',').map(Number)
    // }
    // console.log(fn1(arr));


    //第三种方法
    /*
        使用reduce方法累加效果，实现思路跟常规的递归方法有些相似
    */
    // function fn2(arr) {
    //     return arr.reduce((a, b) => {
    //         if (Array.isArray(b)) {
    //             return a.concat(fn2(b))
    //         } else {
    //             return a.concat(b)
    //         }
    //     }, [])
    // }
    // console.log(fn2(arr));


    /*
        第四种方法
        先用数组的 some 方法把数组中仍然是组数的项过滤出来，然后执行 concat 操作，
        利用 ES6 的展开运算符，将其拼接到原数组中，最后返回原数组。
    */
    // function fn3(arr) {
    //     while (arr.some((item) => {
    //         return Array.isArray(item)
    //     })) {
    //         arr = [].concat(...arr)
    //     }
    //     return arr
    // }
    // console.log(fn3(arr));

    /*
        第五种方法
        ES6的flat方法
        flat() 方法会按照一个可指定的深度递归遍历数组，并将所有元素与遍历到的子数组中的元素合并为一个新数组返回
    */
    // function fn4(arr) {
    //     return arr.flat(Infinity)
    // }
    // console.log(fn4(arr));
</script>

</html>